﻿//////////////////////////////////////////////////////////////////////////////
//
// Copyright © 1998-2024 Glodon Company Limited.
//
// Licensed under the MIT License
//
// Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the “Software”),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
// sell copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
//////////////////////////////////////////////////////////////////////////////
#include "UniIdentity.h"
#include "IParameterDisplayManager.h"
#include <map>
#include "IDocument.h"
#include "ParameterDisplayManager.h"
#include "IParameterDisplay.h"
#include "EnableCompileWarning_The_LAST_IncludeInCpp.h"

using namespace gcmp;

namespace
{
    static IParameterDisplayManager::IParameterDisplayCreator s_parameterDisplayCreator;
}

gcmp::IParameterDisplayManager::~IParameterDisplayManager()
{

}

gcmp::IParameterDisplayManager* gcmp::IParameterDisplayManager::Get(const IDocument* pDoc)
{
    DBG_WARN_AND_RETURN_NULLPTR_UNLESS(pDoc, L"pDoc为空",L"GDMPLab",L"2024-03-30");
    static std::map<RuntimeId, OwnerPtr<IParameterDisplayManager>> s_ParamDisplayMgr;

    RuntimeId docId = pDoc->GetRuntimeId();
    auto iter = s_ParamDisplayMgr.find(docId);
    if (iter == s_ParamDisplayMgr.cend())
    {
        s_ParamDisplayMgr[docId] = NEW_AS_OWNER_PTR(ParameterDisplayManager, pDoc);
    }
    else
    {
        ParameterDisplayManager* pParamDisplayMgr = quick_cast<ParameterDisplayManager>(iter->second.get());
        if (!pParamDisplayMgr || !pParamDisplayMgr->GetDocument())
        {
            iter->second = NEW_AS_OWNER_PTR(ParameterDisplayManager, pDoc);
        }
    }

    IParameterDisplayManager* pParamDisplayMgr = s_ParamDisplayMgr[docId].get();
    DBG_WARN_AND_RETURN_NULLPTR_UNLESS(pParamDisplayMgr, L"无效的参数显示管理器",L"GDMPLab",L"2024-03-30");
    if (ParameterDisplayManager * pMgr 
        = quick_cast<ParameterDisplayManager>(pParamDisplayMgr))
    {
        if (pMgr->GetDocument() != pDoc)
            DBG_WARN_AND_RETURN_NULLPTR_UNLESS(pParamDisplayMgr, L"文档指针异常",L"GDMPLab",L"2024-03-30");
    }

    return pParamDisplayMgr;
}

void gcmp::IParameterDisplayManager::SetParameterDisplayCreator(IParameterDisplayCreator creator)
{
    s_parameterDisplayCreator = creator;
}

IParameterDisplayManager::IParameterDisplayCreator gcmp::IParameterDisplayManager::GetParameterDisplayCreator()
{
    return s_parameterDisplayCreator;
}

bool gcmp::IParameterDisplayManager::AddBuiltInParameterDisplay(OwnerPtr<IParameterDisplay> oParameterDisplay)
{
    return ParameterDisplayManager::AddBuiltInParameterDisplay(TransferOwnership(oParameterDisplay));
}

bool gcmp::IParameterDisplayManager::ReplaceBuiltInParameterDisplay(OwnerPtr<IParameterDisplay> oParameterDisplay)
{
    return ParameterDisplayManager::ReplaceBuiltInParameterDisplay(TransferOwnership(oParameterDisplay));
}
